//package cn.yu.takeoutbackend.scientificResearchManagementSystem.listener;
//
//import cn.yu.takeoutbackend.scientificResearchManagementSystem.dao.IMapper;
//import cn.yu.takeoutbackend.scientificResearchManagementSystem.entity.ScientificStatisticsDocument;
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.metadata.CellData;
//import com.alibaba.excel.metadata.CellExtra;
//import com.alibaba.excel.read.listener.ReadListener;
//import lombok.extern.slf4j.Slf4j;
//
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//// 有个很重要的点 DemoDataListener 不能被spring管理，要每次读取excel都要new,然后里面用到spring可以构造方法传进去
//@Slf4j
//public class DataListener<S> implements ReadListener<ScientificStatisticsDocument> {
//
//    /**
//     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
//     */
//    private static final int BATCH_COUNT = 100;
//    /**
//     * 缓存的数据
//     */
//    private List<ScientificStatisticsDocument> cachedDataList = new ArrayList<>();
//    /**
//     * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
//     */
//    private IMapper mapper;
//
//    /**
//     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
//     *
//     * @param demoDAO
//     */
//    public DataListener(IMapper mapper) {
//        this.mapper = mapper;
//    }
//
//    /**
//     * All listeners receive this method when any one Listener does an error report. If an exception is thrown here, the
//     * entire read will terminate.
//     *
//     * @param exception
//     * @param context
//     * @throws Exception
//     */
//    @Override
//    public void onException(Exception exception, AnalysisContext context) throws Exception {
//
//    }
//
//    /**
//     * When analysis one head row trigger invoke function.
//     *
//     * @param headMap
//     * @param context
//     */
//    @Override
//    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
//
//    }
//
//    /**
//     * 这个每一条数据解析都会来调用
//     *
//     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
//     * @param context
//     */
//    @Override
//    public void invoke(ScientificStatisticsDocument data, AnalysisContext context) {
////        log.info("解析到一条数据:{}",J SON.toJSONString(data));
//        cachedDataList.add(data);
//        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
//
//    }
//
//    /**
//     * The current method is called when extra information is returned
//     *
//     * @param extra   extra information
//     * @param context
//     */
//    @Override
//    public void extra(CellExtra extra, AnalysisContext context) {
//
//    }
//
//    /**
//     * 所有数据解析完成了 都会来调用
//     *
//     * @param context
//     */
//    @Override
//    public void doAfterAllAnalysed(AnalysisContext context) {
//        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
//        saveData();
//        log.info("所有数据解析完成！");
//    }
//
//    /**
//     * Verify that there is another piece of data.You can stop the read by returning false
//     *
//     * @param context
//     * @return
//     */
//    @Override
//    public boolean hasNext(AnalysisContext context) {
//        return false;
//    }
//
//    /**
//     * 加上存储数据库
//     */
//    private void saveData() {
//        log.info("{}条数据，开始存储数据库！", cachedDataList.size());
//        mapper.saveBatch(cachedDataList);
//        log.info("存储数据库成功！");
//    }
//}